package com.gitee.yannzh.rune.support.crud.base;

import com.gitee.yannzh.rune.core.base.pagination.PageResult;
import com.gitee.yannzh.rune.core.base.pojo.Param;
import org.springframework.web.multipart.MultipartFile;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

/**
 * 默认service基类
 *
 * @author Yann
 * @description
 * @date 2025-04-18
 */
public interface IDefaultService<T, V> {


    V getByKey(Serializable key);

    /**
     * 根据查询条件查询  转vo
     *
     * @param key 主键ID
     * @return vo
     */
    <Q extends Param> V get(Q query);


    /**
     * 根据查询对象分页查询vo
     *
     * @param query
     * @param <Q>
     * @return
     */
    <Q extends Param> PageResult<V> pageList(Q query);

    /**
     * 根据查询对象查询 转vo
     *
     * @param query
     * @return
     */
    <Q extends Param> List<V> find(Q query);

    /**
     * 根据vo保存
     *
     * @param param
     * @return
     */
    <P extends Param> Serializable save(P param);

    /**
     * 根据vo id更新
     *
     * @param form
     * @return
     */
    <P extends Param> void updateById(P form);


    void removeByKey(Serializable key);

    void removeByKeys(Collection<? extends Serializable> keys);

    <P extends Param> void remove(P param);

    //_____________________TODO______________________________________________________________

    /**
     * 导出excel
     *
     * @param query
     * @param fileName
     * @param <Q>
     */
    <Q extends Param> void exportExcel(Q query, String fileName);

    /**
     * 指定泛型导出
     *
     * @param query
     * @param clazz
     * @param fileName
     * @param <Q>
     * @param <E>
     */
    <Q extends Param, E> void exportExcel(Q query, Class<E> clazz, String fileName);

    /**
     * 导入
     *
     * @param file
     */
    void importExcel(MultipartFile file);


}
